package cn.lizemin.factory.version2;

import cn.lizemin.factory.version2.parser.FileParser;
import cn.lizemin.factory.version2.parserFacory.*;

import java.io.File;

/**
 * @author lzm
 * @version 1.0
 * @description: 将if-else创建对象的代码封装到一个简单工厂类中
 *
 *  需求是：根据不同的文件名后缀创建对应的解析器，去解析文件，读取数据
 * @date 2022/4/14 11:29
 */
public class Client {
    /**
     * 程序的入口
     */
    public static void main(String[] args) {
        /**
         * 如果不使用工厂模式的话，每次解析文件都需要充斥这些大量的if-else片段，来创建对象
         */
//        if ("md".equals(fileType)){
//            fileParser = new MdParser();
//        } else if ("ppt".equals(fileType)) {
//            fileParser = new PptParser();
//        } else if ("doc".equals(fileType)) {
//            fileParser = new DocParser();
//        } else if ("txt".equals(fileType)) {
//            fileParser = new TxtParser();
//        }
//        //执行剩下的业务逻辑。。。。
//        fileParser.parse(file);


        /**
         * 使用简单工厂模式改造后, 代码简洁了很多，可读性更高
         * 但是随着要解析的文件越来越多，简单工厂类会越来越复杂
         */
//        FileParser fileParser = FileParserFactory.getInstance("md");
//        fileParser.parse(file);

        /**
         * 使用工厂方法，创建具体的解析器
         *
         *
         * 存在的缺陷：
         *  1.每次在创建具体的工厂类的时候，跟之前没使用设计模式一样，又是大量的if-else代码
         *
         *      解决办法：使用缓存工厂，为工厂类再创建一个简单工厂类
         *
         *
         *  2. 如果需要创建的解析器的种类太多，每种解析器都需要创建具体的工厂类，那会导致工厂类爆炸
         *   要知道全球的产品高达几亿种
         *
         * 解决办法：
         *    对工厂进行分类，每种工厂可以创建多种不同类型的产品
         *    比如：工厂可以分为三大类，低端，中端，高端，每种工厂都可以生产所有类型的产品
         */
//        String fileType = "";
//        ParserFactory parserFactory = null;
//        if ("doc".equals(fileType)) {
//            parserFactory = new DocParserFactory();
//        } else if ("ppt".equals(fileType)) {
//            parserFactory = new PptParserFactory();
//        } else if ("txt".equals(fileType)) {
//            parserFactory = new TxtParserFactory();
//        } else if ("md".equals(fileType)) {
//            parserFactory = new MdParserFactory();
//        }
//
//        FileParser fileParser = parserFactory.createFileParser();
//        fileParser.parse(new File(""));

        /**
         * 使用工厂方法的简单工厂类优化后代码
         */
//        ParserFactory parserFactory = ParserFactoryMap.getParserFactory(fileType);
//        FileParser fileParser = parserFactory.createFileParser();
//        fileParser.parse(new File(""));


    }
}
